package com.example.demo;

import jnr.ffi.Pointer;
import jnr.ffi.Runtime;
import jnr.ffi.Struct;
import jnr.ffi.annotations.Delegate;
import jnr.ffi.annotations.In;
import jnr.ffi.annotations.Out;
import jnr.ffi.annotations.StdCall;

public interface NC {
    @StdCall
    boolean NET_DVR_SetLogToFile(int nLogLevel, @In String strLogDir, boolean bAutoDel);

    @StdCall
    boolean NET_DVR_SetSDKInitCfg(int enumType, @In Pointer lpInBuff);

    @StdCall
    boolean NET_DVR_Init();

    @StdCall
    boolean NET_DVR_Cleanup();

    @StdCall
    boolean NET_DVR_SetConnectTime(int dwWaitTime, int dwTryTimes);

    @StdCall
    boolean NET_DVR_SetReconnect(int dwInterval, boolean bEnableRecon);

    @StdCall
    boolean NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, @In Pointer pUser);

    @StdCall
    long NET_DVR_Login_V30(@In String sDVRIP, short wDVRPort, @In String sUserName, @In String sPassword, @Out DVR_DEVICEINFO_V30 lpDeviceInfo);

    @StdCall
    long NET_DVR_SetupAlarmChan_V41(long lUserID, @In NET_DVR_SETUPALARM_PARAM lpSetupParam);

    //typedef void (CALLBACK *MSGCallBack)(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser);
    public interface MSGCallBack{
        @Delegate
        @StdCall
        // void invoke(long lCommand,  NET_DVR_ALARMER pAlarmer, String pAlarmInfo, int  dwBufLen, Pointer pUser);
        void invoke(long lCommand,  Pointer pAlarmer, String pAlarmInfo, int  dwBufLen, Pointer pUser);
    }

    // public interface Constant{
    final int SERIALNO_LEN = 48;
    final int NAME_LEN = 32;
    final int MACADDR_LEN = 6;
    final int NET_SDK_MAX_FILE_PATH = 256;
    // }


    public static class NET_DVR_SETUPALARM_PARAM extends Struct{

        public NET_DVR_SETUPALARM_PARAM(Runtime runtime) {
            super(runtime);
        }

        DWORD dwSize = new DWORD();
        BYTE  byLevel = new BYTE(); //布防优先级，0-一等级（高），1-二等级（中），2-三等级（低）
        BYTE  byAlarmInfoType = new BYTE(); //上传报警信息类型（抓拍机支持），0-老报警信息（NET_DVR_PLATE_RESULT），1-新报警信息(NET_ITS_PLATE_RESULT)2012-9-28
        BYTE  byRetAlarmTypeV40 = new BYTE(); //0--返回NET_DVR_ALARMINFO_V30或NET_DVR_ALARMINFO, 1--设备支持NET_DVR_ALARMINFO_V40则返回NET_DVR_ALARMINFO_V40，不支持则返回NET_DVR_ALARMINFO_V30或NET_DVR_ALARMINFO
        BYTE  byRetDevInfoVersion = new BYTE(); //CVR上传报警信息回调结构体版本号 0-COMM_ALARM_DEVICE， 1-COMM_ALARM_DEVICE_V40
        BYTE  byRetVQDAlarmType = new BYTE(); //VQD报警上传类型，0-上传报报警NET_DVR_VQD_DIAGNOSE_INFO，1-上传报警NET_DVR_VQD_ALARM
        //1-表示人脸侦测报警扩展(INTER_FACE_DETECTION),0-表示原先支持结构(INTER_FACESNAP_RESULT)
        BYTE  byFaceAlarmDetection = new BYTE();
        //Bit0- 表示二级布防是否上传图片: 0-上传，1-不上传
        //Bit1- 表示开启数据上传确认机制；0-不开启，1-开启
        //Bit6- 表示雷达检测报警(eventType:radarDetection)是否开启实时上传；0-不开启，1-开启（用于web插件实时显示雷达目标轨迹）
        BYTE  bySupport = new BYTE(); 
        //断网续传类型 
        //bit0-车牌检测（IPC） （0-不续传，1-续传）
        //bit1-客流统计（IPC）  （0-不续传，1-续传）
        //bit2-热度图统计（IPC） （0-不续传，1-续传）
        //bit3-人脸抓拍（IPC） （0-不续传，1-续传）
        //bit4-人脸对比（IPC） （0-不续传，1-续传）
        BYTE  byBrokenNetHttp = new BYTE();
        WORD  wTaskNo = new WORD();    //任务处理号 和 (上传数据NET_DVR_VEHICLE_RECOG_RESULT中的字段dwTaskNo对应 同时 下发任务结构 NET_DVR_VEHICLE_RECOG_COND中的字段dwTaskNo对应)
        BYTE  byDeployType = new BYTE();    //布防类型：0-客户端布防，1-实时布防
        BYTE  bySubScription = new BYTE();	//订阅，按位表示，未开启订阅不上报  //占位
        //Bit7-移动侦测人车分类是否传图；0-不传图(V30上报)，1-传图(V40上报)
        BYTE[]  byRes1 = new BYTE[2];
        BYTE  byAlarmTypeURL = new BYTE();//bit0-表示人脸抓拍报警上传（INTER_FACESNAP_RESULT）；0-表示二进制传输，1-表示URL传输（设备支持的情况下，设备支持能力根据具体报警能力集判断,同时设备需要支持URL的相关服务，当前是”云存储“）
        //bit1-表示EVENT_JSON中图片数据长传类型；0-表示二进制传输，1-表示URL传输（设备支持的情况下，设备支持能力根据具体报警能力集判断）
        //bit2 - 人脸比对(报警类型为COMM_SNAP_MATCH_ALARM)中图片数据上传类型：0 - 二进制传输，1 - URL传输
        //bit3 - 行为分析(报警类型为COMM_ALARM_RULE)中图片数据上传类型：0 - 二进制传输，1 - URL传输，本字段设备是否支持，对应软硬件能力集中<isSupportBehaviorUploadByCloudStorageURL>节点是否返回且为true
        BYTE  byCustomCtrl = new BYTE();//Bit0- 表示支持副驾驶人脸子图上传: 0-不上传,1-上传
    }

    public static class NET_DVR_ALARMER extends Struct {

        public NET_DVR_ALARMER(Runtime runtime) {
            super(runtime);
        }

        public BYTE byUserIDValid =new BYTE();                 /* userid是否有效 0-无效，1-有效 */
        public BYTE bySerialValid =new BYTE();                 /* 序列号是否有效 0-无效，1-有效 */
        public BYTE byVersionValid =new BYTE();                /* 版本号是否有效 0-无效，1-有效 */
        public BYTE byDeviceNameValid =new BYTE();             /* 设备名字是否有效 0-无效，1-有效 */
        public BYTE byMacAddrValid =new BYTE();                /* MAC地址是否有效 0-无效，1-有效 */    
        public BYTE byLinkPortValid =new BYTE();               /* login端口是否有效 0-无效，1-有效 */
        public BYTE byDeviceIPValid =new BYTE();               /* 设备IP是否有效 0-无效，1-有效 */
        public BYTE bySocketIPValid =new BYTE();               /* socket ip是否有效 0-无效，1-有效 */
        public LONG lUserID = new LONG();                       /* NET_DVR_Login()返回值, 布防时有效 */
        public Struct.String sSerialNumber = new Struct.AsciiString(SERIALNO_LEN);    /* 序列号 */
        public DWORD dwDeviceVersion = new DWORD();                /* 版本信息 高16位表示主版本，低16位表示次版本*/
        public String sDeviceName = new AsciiString(NAME_LEN);            /* 设备名字 */
        public Unsigned8 byMacAddr[] = array(new Unsigned8[MACADDR_LEN]);        /* MAC地址 */    
        public WORD wLinkPort = new WORD();                     /* link port */
        public Struct.String sDeviceIP =new AsciiString(128);                /* IP地址 */
        public Struct.String sSocketIP =new AsciiString(128);                /* 报警主动上传时的socket IP地址 */
        public BYTE byIpProtocol =new BYTE();                  /* Ip协议 0-IPV4, 1-IPV6 */
        
        // public BYTE[] byRes1 = new BYTE[2];
        // public BYTE bJSONBroken = new BYTE();                   //JSON断网续传标志。0：不续传；1：续传
        // public WORD wSocketPort = new WORD();
        // public BYTE[] byRes2 = new BYTE[6];

        public Unsigned8[] byRes2 = array(new Unsigned8[11]);
    }

    public static class DVR_DEVICEINFO_V30 extends Struct{

        public DVR_DEVICEINFO_V30(Runtime runtime) {
            super(runtime);
        }
        
        public Struct.String sSerialNumber = new Struct.AsciiString(SERIALNO_LEN);  //序列号
        public BYTE byAlarmInPortNum = new BYTE();                //报警输入个数
        public BYTE byAlarmOutPortNum = new BYTE();                //报警输出个数
        public BYTE byDiskNum = new BYTE();                    //硬盘个数
        public BYTE byDVRType = new BYTE();                    //设备类型, 1:DVR 2:ATM DVR 3:DVS ......
        public BYTE byChanNum = new BYTE();                    //模拟通道个数
        public BYTE byStartChan = new BYTE();                    //起始通道号,例如DVS-1,DVR - 1
        public BYTE byAudioChanNum = new BYTE();                //语音通道数
        public BYTE byIPChanNum = new BYTE();                    //最大数字通道个数，低位  
        public BYTE byZeroChanNum = new BYTE();            //零通道编码个数 //2010-01-16
        public BYTE byMainProto = new BYTE();            //主码流传输协议类型 0-private, 1-rtsp,2-同时支持private和rtsp
        public BYTE bySubProto = new BYTE();                //子码流传输协议类型0-private, 1-rtsp,2-同时支持private和rtsp
        public BYTE bySupport = new BYTE();        //能力，位与结果为0表示不支持，1表示支持，
        public BYTE bySupport1 = new BYTE();        // 能力集扩充，位与结果为0表示不支持，1表示支持
        public BYTE bySupport2 = new BYTE(); 
        public WORD wDevType = new WORD();              //设备型号
        public BYTE bySupport3 = new BYTE(); //能力集扩展，位与结果为0表示不支持，1表示支持
        public BYTE byMultiStreamProto = new BYTE();//是否支持多码流,按位表示,0-不支持,1-支持,bit1-码流3,bit2-码流4,bit7-主码流，bit-8子码流
        public BYTE byStartDChan = new BYTE();        //起始数字通道号,0表示无效
        public BYTE byStartDTalkChan = new BYTE();    //起始数字对讲通道号，区别于模拟对讲通道号，0表示无效
        public BYTE byHighDChanNum = new BYTE();        //数字通道个数，高位
        public BYTE bySupport4 = new BYTE();        //能力集扩展，位与结果为0表示不支持，1表示支持
        public BYTE byLanguageType = new BYTE();// 支持语种能力,按位表示,每一位0-不支持,1-支持  
        public BYTE byVoiceInChanNum = new BYTE();   //音频输入通道数 
        public BYTE byStartVoiceInChanNo = new BYTE(); //音频输入起始通道号 0表示无效
        public BYTE bySupport5 = new BYTE();  //按位表示,0-不支持,1-支持,bit0-支持多码流
        public BYTE bySupport6 = new BYTE();   //能力，按位表示，0-不支持,1-支持
        public BYTE byMirrorChanNum = new BYTE();    //镜像通道个数，<录播主机中用于表示导播通道>
        public WORD wStartMirrorChanNo = new WORD();  //起始镜像通道号
        public BYTE bySupport7 = new BYTE();   //能力,按位表示,0-不支持,1-支持
        public BYTE byRes2 = new BYTE();        //保留
    }

    public static class NET_DVR_LOCAL_SDK_PATH extends Struct {

        protected NET_DVR_LOCAL_SDK_PATH(Runtime runtime) {
            super(runtime);
        }
        
        public Struct.String sPath = new Struct.AsciiString(NET_SDK_MAX_FILE_PATH);
        public Struct.String byRes = new Struct.AsciiString(128);
    }
}
